package com.yc.thread.interrupte;

/**
 * 中断标记 中断wait等待
 * @author yuancan
 *
 */
public class InterruptWait {
	
	public void m() {
		Object o = new Object();
		Thread t1 = new Thread(() -> {
			synchronized(o) {
				System.out.println("--------------1-");
				try {
					o.wait();
					//这句话没输出：因为在捕获到o.wait()异常之后就跳到catch中了。
					//所以告诉我们一个道理：try{}的范围大小决定了程序的逻辑走向，如果想捕获异常后 下面的逻辑都不走了那么
					//括号范围就大些，如果想捕获异常后依然把剩下的走完（一般就是前后没有因果关系的那种）就把try{}缩小点
					System.out.println("after wait: " + Thread.currentThread().isInterrupted());
				} catch (InterruptedException e) {
					System.out.println("after wait2: " + Thread.currentThread().isInterrupted());//false
					e.printStackTrace();
				}
				System.out.println("--------------2-");
			}
		});
		t1.start();
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		t1.interrupt();
		try {
			Thread.sleep(1);//这里如果不暂停一下，下面会检测到:刚被打断，但中断标记还没被清除的很短暂的一个中间状态
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(t1.isInterrupted());//false。wait被中断后，中断标记被清除
		
	}

	public static void main(String[] args) {
		InterruptWait tw = new InterruptWait();
		tw.m();

	}

}
